let includes = ([
    "include/common.js",
]);


// let {stringp,undefinedp,loadObject,fileNameSid} = require("include/common.js");


let inherits = ([
    "inherit/data.js",
]);

function create() {
    return thisObject;
}

function validObject(ob) {

}


/**
 * 对象创建成功之后...
 * @param ob
 */
function validObjectAfter(ob) {


    // os.debug(" validObjectAfter be call " + ob.__fileName__);

    let gt = os.getGlobalThis();

    os.debug(`farOs loads ${gt["gameObjects"].length} objects`);

    if (ob.__baseFileName__ == "adm/daemons/master/master.js") return true;

    if (ob.__baseFileName__ == "main/main.js") return true;

    //没有get方法的也不要处理了，先放过吧，以后优化
    if (undefinedp(ob.get)) return true;


    //如果是房间或者地图
    if (stringp(ob.get("obType")) && ob.get("obType") == "isRoom") {



        let key, file, nFile, nob, exits;


        if (!undefinedp(ob.get("desc"))) {
            //desc的回车键删除
            key = ob.get("desc");
            key = key.replace(/\r\n/g, "");
            key = key.replace(/\n/g, "");
            ob.set("desc", key);
        }

        if( undefinedp(ob.get("exits")) )  return ;
        //处理出口
        let exitKeys = Object.keys(ob.get("exits"))

        //处理房间出口的连接关系
        for (let exit in exitKeys) {
            key = exitKeys[exit];
            if (key == "") continue;
            //获取文件地址
            file = ob.get("exits")[key];
            //没有就不处理
            if (file == "") {
                os.debug(ob.__fileName__ + " the " + key + " side of this is not set, so continue ");
                continue;
            }
            //加载被连接的房间
            nob = loadObject(file);
            //获取被连接的房间的唯一地址
            nFile = fileNameSid(nob);
            os.debug("new room object filename is " + nFile);
            //文件地址转成对象实例
            ob.get("exits")[key] = nFile;

            //被连接的房间，没有设置出口就跳过
            if (undefinedp(exits = nob.get("exits"))) {
                continue;
            }

            os.debug("-----------被加载房间的地址情况----------");
            os.debug(ob.__baseFileName__);
            os.debug(ob.__fileName__);
            os.debug("-------------------------------------");

            //当前处理的加载的房间的方向如果是西方
            if (key == "west" && !undefinedp(exits["east"])) {
                if (exits["east"] == ob.__baseFileName__) {

                    nob.get("exits")["east"] = ob.__fileName__;
                }
            } else if (key == "east" && !undefinedp(exits["west"])) {
                //被连接的房间west设置了ob的地址，才会进行连接
                if (exits["west"] == ob.__baseFileName__) {
                    nob.get("exits")["west"] = ob.__fileName__;
                }
            }else if (key == "south" && !undefinedp(exits["north"])) {
                //被连接的房间west设置了ob的地址，才会进行连接
                if (exits["north"] == ob.__baseFileName__) {
                    nob.get("exits")["north"] = ob.__fileName__;
                }
            }else if (key == "north" && !undefinedp(exits["south"])) {
                //被连接的房间west设置了ob的地址，才会进行连接
                if (exits["south"] == ob.__baseFileName__) {
                    nob.get("exits")["south"] = ob.__fileName__;
                }
            }
        }


        if (!undefinedp(ob.get("objects"))) {
            let npcOb;
            let objects = ob.get("objects");
            if (objects.length > 0) {
                for (let obx in objects) {
                    if (!undefinedp(npcOb = loadObject(objects[obx]))) {
                        npcOb.move(ob);
                        objects[obx] = fileNameSid(npcOb);
                    }
                }
            }
        }
    }
}


/**
 * 该方法负责构造一个连接对象
 * 流程和传统的OS一样。。。
 * @author Mike/Fang.j/大当家
 * @param ob
 */
function connect(agent, msg) {


}

/**
 * 实际上这个函数是OS内部的函数
 * 现在放到lib来实现吧，写JS就是舒服
 * @author Mike/Fang.j/大当家
 * @param ob
 */
function onMessage(user, msg) {

    //查找这个agent是否 驱动要绑定这个agent才行..
    //这个LogoOb就是User类
    // let userOb = agent.getUser();
    //先不管其他逻辑，直接发...
   // user.commandHook(msg);

     command(user,msg);

}

// /**
//  * 本质上这个方法应该是oS实现，
//  * 所以会走connect方法让开发者做一次验证之类的事情
//  * js嘛。。咱们粗暴点
//  * @param agent
//  */
// function requireLogon(agent) {
//
//     let logon = thisObject().connect(agent);
//     os.debug("验证消息");
//     //做登录验证
//     logon.logon(agent);
// }


// function onRequire(callFile, calledFile, called) {
//     //从系统加载
//     //metaClass
//     let metaCls;
//
//
//
//     if( !jsonp( (metaCls = findMetaClass(callFile)) ) ){ //系统中没有这个require文件
//         called["__metaType__"] = "isRequrie";
//         called["__metaFile__"] = calledFile;
//         //用于记录 继承了自己的子类  可怕....
//         called["__subsFile__"] = [];
//         //没有找到 就添加
//         gt.metaClassSource.push({file: calledFile, cmpl: called, src: ""});
//     }
//
//     metaCls.__subsFile__.push( callFile );
//
//     return metaCls;
//
// }